[AD] Scalaアプリケーションの開発・保守は合同会社ミルクソフトにお任せください
この記事では、Scala 3で廃止されるforSome
キーワードと存在型について解説します。
forSome
は廃止されました
forSome
を使用した存在型は廃止されました。廃止される理由は以下の通りです。
- 存在型は、DOTやDottyが構築されている型の健全性の原則に違反している。
- この原則によると、型選択
p.T
やS#T
のすべての接頭辞(p
, 特にS
)は、実行時に構築された値に由来するか、良好な境界しか持たないことが知られている型を参照しなければならない。
- この原則によると、型選択
- 存在型は、他のScalaの構造体との相互作用が難しい。
- 存在型は経路依存型と大部分が重複しているため、存在型をサポートするメリットが小さい。
forSomeを使用しない存在型は、制約付きながらサポートされる
ワイルドカードのみで表現できる存在型(forSome
ではなく)はサポートされていますが、洗練された型として扱われます。例えば
Map[_ <: AnyRef, Int]
は Map
という型として扱われます。第一の型パラメータの上限境界は AnyRef
で、第二の型パラメータは Int
のエイリアスとなります。
Scala 3.0では完全に廃止
Scala 3.0にはforSome
は実装されませんでした。
したがって、Scala 3.0へのアップデートの前に、forSome
の使用をやめる必要があります。
また、scalacでコンパイルされたクラスファイルを読み込む際には、Dottyは存在型をそれ本来の型で近似するよう試みますが、限界はあります。
たとえばforSome
を使用しているScala 2.13のライブラリをScala 3から使用する場合、挙動を正確に再現できない可能性がありますので注意してください。
存在型の代わりに経路依存型へ移行する
存在型を経路依存型へと移行しましょう。
移行ガイドには参考となるサンプルが紹介されています。
サイト内検索
カテゴリ「Scala 3で廃止予定の機能」の記事
弱適合:Scala 3で廃止予定の機能(13)
DelayedInitの解説:Scala 3で廃止予定の機能(1)
[this]修飾子:Scala 3で廃止予定の機能(12)
Scala 3で変更・廃止予定の機能と移行作業についてのまとめ
シンボルリテラルの解説:Scala 3で廃止予定の機能(3)
自動適用:Scala 3で廃止予定の機能(14)
forSomeによる存在型:Scala 3で廃止予定の機能(6)
型射影:Scala 3で廃止予定の機能(7)
手続き型構文:Scala 3で廃止予定の機能(8)
先行初期化:Scala 3で廃止予定の機能(9)
do-while文の解説:Scala 3で廃止予定の機能(4)
Scala 2のマクロ:Scala 3で廃止予定の機能(5)
クラスシャドウイング:Scala 3で廃止予定の機能(10)
XMLリテラルの解説:Scala 3で廃止予定の機能(2)
大域脱出:Scala 3で廃止予定の機能(11)
カテゴリ「Scala 3で廃止予定の機能」の記事
弱適合:Scala 3で廃止予定の機能(13)
DelayedInitの解説:Scala 3で廃止予定の機能(1)
[this]修飾子:Scala 3で廃止予定の機能(12)
Scala 3で変更・廃止予定の機能と移行作業についてのまとめ
シンボルリテラルの解説:Scala 3で廃止予定の機能(3)
自動適用:Scala 3で廃止予定の機能(14)
forSomeによる存在型:Scala 3で廃止予定の機能(6)
型射影:Scala 3で廃止予定の機能(7)
手続き型構文:Scala 3で廃止予定の機能(8)
先行初期化:Scala 3で廃止予定の機能(9)
do-while文の解説:Scala 3で廃止予定の機能(4)
Scala 2のマクロ:Scala 3で廃止予定の機能(5)
クラスシャドウイング:Scala 3で廃止予定の機能(10)
XMLリテラルの解説:Scala 3で廃止予定の機能(2)
大域脱出:Scala 3で廃止予定の機能(11)